package top.eggcode.plugins.office;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfStamper;
import org.apache.commons.lang3.StringUtils;
import top.eggcode.common.file.FileCompressUtil;
import top.eggcode.common.lang.GraphicCodeUtil;
import top.eggcode.plugins.office.common.DocumentCategory;
import top.eggcode.plugins.office.common.PathGenerator;

import java.io.IOException;
import java.util.Map;

/**
 * PDF模板渲染工具
 * 目前PDF模板只考虑插入一张条形码
 * 模式：{
 * 现在的设计是，把所有的数据放到一个Map集合， 在模式方法中进行拆分。也就是说一个模式只适用于一个模板；
 * }
 */
public class PdfRender {

    private final PathGenerator pathGenerator;

    public PdfRender(PathGenerator pathGenerator) {
        this.pathGenerator = pathGenerator;
    }

    /**
     * 中间方法（不能单独使用），渲染表单域
     * 说明： {
     * setFieldProperty 这个方法应该可以在赋值时，同时设定字体 （BaseFont 对象）
     * }
     *
     * @param formField 可填充的域对象
     * @param props     数据
     */
    public void toText(AcroFields formField, Map<String, String> props) {
        // 遍历 data 给pdf表单表格赋值
        for (String key : props.keySet()) {
            String value = props.get(key) == null ? "" : props.get(key).toString();
            try {
                formField.setField(key, value);
            } catch (IOException | DocumentException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 中间方法（不能单独使用），渲染图形码
     *
     * @param formStamper PDF打印器
     * @param formField   表单域
     * @param code        编码
     */
    public void toGraphicCode(PdfStamper formStamper, AcroFields formField, String fieldName, String code) {

        if (StringUtils.isNotBlank(code)) {
            String imageOutPath = pathGenerator.getDocument(DocumentCategory.PNG);

            GraphicCodeUtil.generateBarCodeByMagnification(imageOutPath, code, 2, 25);
            // 通过 pdf 表单控件名称获取所在页和坐标，左下角为起点
            int pageNo = formField.getFieldPositions(fieldName).get(0).page;
            Rectangle signRect = formField.getFieldPositions(fieldName).get(0).position;
            float x = signRect.getLeft();
            float y = signRect.getBottom();
            // 读图片
            Image image = null;
            try {
                image = Image.getInstance(imageOutPath);
                // 获取操作的页面
                PdfContentByte under = formStamper.getOverContent(pageNo);
                // 根据域的大小缩放图片
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                // 添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            } catch (IOException | DocumentException e) {
                e.printStackTrace();
            } finally {
                // 任务完成之后，删除临时文件
                FileCompressUtil.deleteFile(imageOutPath);
            }

        }
    }
}
